#ifndef _SNAKE_H 
#define _SNAKE_H 

//Includes Classes pre-definidas no c 
#include <stdio.h> 
#include <go32.h> 
#include <sys/farptr.h>  
#include <string.h> 
#include <dos.h> 
#include <conio.h> 
#include <stdlib.h> 
#include <sys/nearptr.h> 
#include <dpmi.h> 
#include <pc.h> 
#include <time.h> //para funcao random 

//Includes da Biblioteca Pessoal 
#include "utypes.h" 
#include "video-text.h" //placa modo texto 
#include "video-graphics.h" //placa modo grafico 
#include "music.h" //altifalante 
#include "timer.h"  
#include "ints.h" //interrupcoes 
#include "queue.h" 
#include "kbc.h" 
#include "rtc.h" 
#include "ranking.h"
#include "codepage.h"
//#include "GQueue.h" 
//#include "gqueue.h" 

/** @defgroup Snake Snake 
  * @{ 
  * 
  * Funcoes para a execucao do jogo 
  */ 

/*Definicao de variaveis*/ 

#define LEFT 1 
#define RIGHT 2 
#define UP 3 
#define DOWN 4 
#define BEND_SIZE 1000 

/*struct Position { 
         int x; // Stores Head X Coordinate 
         int y; // Stores Head Y Coordinate 
         int dir; // Stores Head Direction 
 }*/ 

/** Estrutura SNAKE */ 
typedef struct { 
	int length_p; 
	int length; 
	int head_x; // Stores Head X Coordinate 
	int head_y; // Stores Head Y Coordinate 
	int head_dir; // Stores Head Direction 
	int tail_x; // Stores Tail X Coordinat 
	int tail_y; // Stores Tail Y Coordinat 
	int tail_dir; // Stores Tail Direction 
	int bend_x [BEND_SIZE]; //Stores X Bend Coordinate Declare it big enough to accomodate maximum bends 
	int bend_y[BEND_SIZE]; // Stores Y Bend Coordinate Declare it big enough to accomodate maximum bends  
	int bend_dir[BEND_SIZE]; 
} snake; // Declares a variable of the structure 


/** Funcao responsavel pelo teste de set_pixel em MODO GRAFICO */
void ver_erros(); 

/** Funcao responsavel pela criacao da area de jogo.
 *  Sao 4 linhas paralelas.
 */
void reset_margin(); 

/** Funcao responsavel pela inicializacao da cobra (snake).
 * Sao definidas as caracteristicas e os valores iniciais
 */
void initsnake(); 

/** Funcao responsavel pela inicializacao do ecra.
 * Sao definidas as caracteristicas e os valores iniciais (cor de fundo, e dos caracteres)
 */
void initscreen(); 

/** Funcao responsavel pela criacao dos pontos a serem recolhidos pela snake.
 *   Gera aleatoriamente os pontos, no ecra. 
 */
void gera_comida(); 

/** Funcao que pinta a negro a pontuacao gerada, depois de ser recolhida pela snake */
void apaga_comida(); 

/** Funcao responsavel pela leitura das teclas responsaveis pelo
 * direccioamento da snake recorrendo as interrupcoes do teclado. 
 */ 
void userinput(); 

/** Funcao responsavel pela verificacao de colisao de pixeis. Caso exista colisao surge GAME OVER. */
int verifica_colisao(); 

/** Funcao responsavel pela interpretacao das teclas recebidas pela funcao userinput, e pelo
 * dirrecionamento da cabeca e da cauda, respectivamente. 
 */
void movesnake(); 

/** Gera movimento da cobra */
void moves(); 

/** Funcao que gera um valor aleatorio, entre dois inteiros. */
int randomvalue (int starting, int ending);

/** Funcao que lanca o menu de acolhimento ao jogador, bem como as instrucoes de jogo */
void start();

/**Funcao que lanca o menu final, depois de ocorrer GAME OVER. */
void finish();

/** Funcao auxiliar recursiva para inicializar o jogo */
void playsnake();


#endif 
